package com.example.config;

import com.example.entity.LoginEntity;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
    //不需要继承这个类，同样可以，完全没用
    /*
    要启用缓存支持，我们需要创建一个新的 CacheManager bean。
    CacheManager 接口有很多实现，本文演示的是和 Redis 的集成，自然就是用 RedisCacheManager 了。
    Redis 不是应用的共享内存，它只是一个内存服务器，就像 MySql 似的，
    我们需要将应用连接到它并使用某种“语言”进行交互，
    因此我们还需要一个连接工厂以及一个 Spring 和 Redis 对话要用的 RedisTemplate，
    这些都是 Redis 缓存所必需的配置，把它们都放在自定义的 CachingConfigurerSupport 中
     */

    //@bean 也可以依赖其他任意数量的bean，
    // CacheManager 依赖 RedisTemplate，我们可以通过方法参数实现这个依赖
    @Bean
    public CacheManager cacheManager (RedisTemplate<?,?> redisTemplate) {
        CacheManager cacheManager = new RedisCacheManager(redisTemplate);
        return cacheManager;
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        redisTemplate.setConnectionFactory(factory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //redisTemplate.setValueSerializer((new JdkSerializationRedisSerializer()));
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(LoginEntity.class);
        /*
        发现了一个有趣的现象，之前用的jdk存的一个value，然后换成jackson2，key都是5，居然删不掉
        然后set一下，就把value覆盖了，然后就可以删除了，每次登录都应该set一下，然后在操作就是
        直接去缓存查，查不到（比如因为set带时限），去数据库查询到了在set，也带个时限试试
         */

        redisTemplate.setValueSerializer(serializer);
        return redisTemplate;
    }
}
